/**********************************************************************
// 每个一秒讲当前的时间写入指定的文件中
// 当前的时间信息可以通过ctiem函数获得
// 但是ctime函数的返回值是一个字符串指针，需要将其规格化之后放入缓冲区中，此时可以调用sprintf函数来完成
*/

/*这是一个在参数指定文件中连续写入当前时间的应用*/
// 文件以1s为时间间隔，将当前的时间写入文件，然后回车换行
// 使用lseek在一个文件中连续写入字符串的应用

#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/time.h>
#include <string.h>
#include <time.h>
int main(int argc, char *argv[]){

	// 偏移量计算的中间变量
	int temp=0, seektemp=0;
	int writeCount = 0;

	// 用来记录两次时间，并比较是否超出1s
	struct timeval timeold,timenow;

	// 创建timezone结构体，用来记录时区
	struct timezone timez;

	// 创建time_t结构体，用来记录当前时间
	time_t timetemp;

	// 文件描述符
	int fp;

	// 写入文件的缓冲区
	char writebuf[100];

	// 判断是否输入文件名，如果未指定文件，则退出
	if( argc != 2){
		printf("Please input correct filename, eg. './exam314WriteTimetoFileFun filename'\n");
		return -1;
	}

	// 如果已经指定了对应的文件，则讲时间写入filename中
	fp = open(*(argv+1), O_RDWR|O_CREAT, S_IRWXU);

	// 打印文件描述符
	printf("The Descriptions of file is %d\n", fp);

	// 读取时间
	gettimeofday(&timeold, &timez);

	// 判断时间间隔是否超过1s，超过1s则写入文件中
	while(1){
	
		while(1){
			gettimeofday(&timenow, &timez);

			if((timenow.tv_sec-timeold.tv_sec) >= 1){
				// 如果时间到达1s，则更新old时间
				timeold = timenow;
				break;
			}
		}

		// 如果时间间隔还未到1s,则等待
		time(&timetemp);	// 获取时间参数
		printf("%s",ctime(&timetemp));


		// 使用sprintf()函数将时间信息写入缓冲区
		sprintf(writebuf, "%s", ctime(&timetemp));

		// 此时将时间写入filename文件中
		if(temp == 0){
			write(fp,writebuf, strlen(writebuf));	// 讲数据写入文件中
			seektemp = lseek(fp,0,SEEK_CUR);	// 获得当前的偏移量
			temp += seektemp;

		}else{
			write(fp, writebuf, strlen(writebuf));
			seektemp = lseek(fp, temp, SEEK_CUR);
			temp += seektemp;
			writeCount++;
		}
	}

	close(fp);
	return 0;
}
